import 'dotenv/config';
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
import { HttpExceptionFilter } from './filters/http-exception.filter';
import { TransformInterceptor } from './interceptor/transform/transform.interceptor';
import * as helmet from 'helmet';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { NestExpressApplication } from '@nestjs/platform-express';
const PORT = process.env.PORT || 8080;
const PREFIX = process.env.PREFIX || '/';

async function bootstrap() {
  const IS_DEV = process.env.NODE_ENV !== 'production';
  const app = await NestFactory.create<NestExpressApplication>(AppModule)
  // 全局路由前缀
  app.setGlobalPrefix(PREFIX);
  // 全局注册错误的过滤器
  app.useGlobalFilters(new HttpExceptionFilter());
  // 全局注册拦截器 封装返回前端数据
  app.useGlobalInterceptors(new TransformInterceptor());
  // 跨域
  app.enableCors();
  //防止跨站脚本攻击
  app.use(helmet());
  // 配置静态目录
  // app.useStaticAssets('public'); //方式一
  // 访问 http://localhost:3000/static/uploads/2021/10/20/1634692428477.jpeg
  // app.useStaticAssets(join(__dirname, '..', 'public'), { //方式二
  //   prefix: '/static/'
  // })
  //CSRF保护：跨站点请求伪造
  // app.use(csurf());
  
  if (IS_DEV) {
    // 配置api文档信息
    const options = new DocumentBuilder()
      .setTitle('nest framework  api文档')
      .setDescription('nest framework  api接口文档')
      .addServer(PREFIX) // 设置基础的路径
      .addBearerAuth({ type: 'apiKey', in: 'header', name: 'token' }) // 设置请求头的token字段
      .setVersion('0.0.1')
      .build();
    const document = SwaggerModule.createDocument(app, options);
    SwaggerModule.setup(`${PREFIX}/docs`, app, document);
  }
  return app
}
// 注意: 通过注入 NODE_ENV 为 local，来方便本地启动服务，进行开发调试
const isLocal = process.env.NODE_ENV === 'local'
if (isLocal) {
  bootstrap().then((app) => {
    app.listen(PORT, () => {
      console.log(`服务已经启动： http://localhost:${PORT}`)
    })
  })
}

// 导出启动函数，给 sls.js 使用
export { bootstrap }